package com.ptl.bp.dto;

import com.ptl.bp.config.DataAccessEnum;
import com.ptl.bp.config.SensitiveData;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.net.URI;
import java.util.List;
import java.util.Map;

/**
 * 电池标签与合规性信息实体类
 * 描述：包含电池标签、符合性声明和测试报告结果等信息
 */
@Data
@Schema(description = "电池标签和符合性数据模型")
public class BatteryLabelsEntity {

    // 标签主题枚举
    public enum LabelingSubject {
        @Schema(description = "分类收集") SeparateCollection,
        @Schema(description = "危险材料") HazardousMaterial,
        @Schema(description = "碳足迹") CarbonFootPrint,
        @Schema(description = "灭火剂") ExtinguishingAgent
    }

    // 标签实体
    @Data
    @Schema(description = "标签实体")
    public static class LabelingInfo {
        @NotNull(message = "标签符号URL不能为空")
        @Schema(description = "标签符号资源路径", required = true, format = "uri")
        private String labelingSymbol;

        @NotEmpty(message = "标签含义不能为空")
        @Schema(
            description = "所有符号和标签含义的解释（包括分类收集；镉和铅；碳足迹和碳足迹性能等级符号；以及印刷在电池或其随附文件上但无法通过电池护照访问的符号和标签）",
            required = true
        )
        private Map<String, String> labelingMeaning; // key: 语言代码, value: 文本

        @NotNull(message = "标签主题不能为空")
        @Schema(description = "所需标签主题的简称", required = true)
        private LabelingSubject labelingSubject;
    }

    @NotNull(message = "符合性声明不能为空")
    @Schema(description = "电池护照必须包含欧盟符合性声明。\n\n法规规定了关于欧盟符合性声明的以下要求（参见BattReg附件XIII(1r)和BattReg第18条(2)）：\n\n- 欧盟符合性声明具有附件IX中规定的模型结构\n- 欧盟符合性声明必须包含附件VIII中规定的相关模块中指定的元素\n- 欧盟符合性声明必须保持最新\n- 它被翻译成电池投放市场或投入使用所在成员国要求的语言\n- 必须以电子格式制定，并在要求时以纸质格式提供",required = true )
    private String declarationOfConformity;

    @SensitiveData(hasAnyRole = {DataAccessEnum.CERTIFIER, DataAccessEnum.REGULATOR, DataAccessEnum.EU_COMMISSION})
    @NotNull(message = "测试报告结果不能为空")
    @Schema(description = "包含证明符合市场符合性评估程序要求的测试报告结果的文档URL（根据技术文档（第7-10条、第12-14条和尽职调查政策））",required = true )
    private String resultOfTestReport;

    @NotEmpty(message = "标签列表不能为空")
    @Schema(description = "'分类收集'或'WEEE标签'，表明产品不应作为未分类废物丢弃，而必须送到分类收集设施进行回收和再循环。建议也翻译为文本以确保机器可读性",required = true )
    private List<LabelingInfo> labels;
}